#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>

//消息结构体
struct msg_struct{
    long type;
    char text[128];
};

void handler(int sig)
{
    return;
}

int main(int argc, char *argv[])
{
    int msg_id;

    //亲缘进程消息队列
    msg_id = msgget(IPC_PRIVATE, 0777); 
    if(msg_id < 0){
        printf("创建消息队列失败\n");
    }

    int pid;
    pid = fork();
    if(pid > 0){
        signal(SIGUSR1, handler);
        printf("我是父进程\n");

        //初始化消息
        struct msg_struct msg;
        msg.type = 100;

        while(1){
            //从键盘获取
            fgets(msg.text, 128, stdin);
            //写入信号队列
            msgsnd(msg_id, (const void*)&msg, 128, 0);
            //发信号给子进程
            kill(pid,SIGUSR2);
            // pause();
        }
    }
    else{
        signal(SIGUSR2, handler);
        printf("我是子进程\n");
        
        //定义消息对象
        struct msg_struct msg;

        while(1){
            // pause();
            //读取消息队列消息
            msgrcv(msg_id, (void*)&msg, 128, 100, 0);
            printf("子进程读取消息队列：%s",msg.text);
            //发信号给父进程
            kill(getppid(),SIGUSR1);
        }
    }

    return 0;
}

